package com.t2tierp.pafecf.controller;

import com.t2tierp.pafecf.view.Caixa;
import br.com.modelo.DavCabecalho;
import br.com.modelo.DavDetalhe;
import br.com.util.Biblioteca;
import br.com.util.JPAUtil;
import com.t2tierp.pafecf.infra.Ecf;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class DAVController {

    String consultaSQL;
    Statement stm;
    PreparedStatement pstm;
    ResultSet rs;
    java.util.Date d = new java.util.Date();
    Boolean consultaServer = true;

    public List<DavDetalhe> carregaDAV(Integer pId) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM DavDetalhe c WHERE c.ID = ?");
        q.setParameter(1, pId);
        List<DavDetalhe> retorno = q.getResultList();
        em.close();
        return retorno;
    }

    public void fechaDAV(Integer pId, Integer pCCF, Integer pCOO) {
        try {
            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm:ss");

            DavCabecalho davCabecalho = consultaDavCabecalho(pId);
            davCabecalho.setDataEmissao(Ecf.getDataHoraEcf());
            davCabecalho.setHoraEmissao(formatoHora.format(Ecf.getDataHoraEcf()));
            davCabecalho.setSituacao('E');
            String tripa = ""
                    + davCabecalho.getId()
                    + davCabecalho.getIdPessoa()
                    + pCCF
                    + pCOO
                    + davCabecalho.getNomeDestinatario()
                    + davCabecalho.getCpfCnpjDestinatario()
                    + formatoData.format(davCabecalho.getDataEmissao())
                    + davCabecalho.getHoraEmissao()
                    + davCabecalho.getSituacao()
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getTaxaAcrescimo().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getAcrescimo().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getTaxaDesconto().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getDesconto().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getSubtotal().toString()))
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(davCabecalho.getValor().toString()))
                    + davCabecalho.getNumeroDav()
                    + Caixa.aCBrECF.getNumECF()
                    + "0";
            davCabecalho.setHashTripa(Biblioteca.MD5String(tripa));

            davCabecalho = (DavCabecalho) JPAUtil.mergeObjeto(davCabecalho);

            DavDetalhe davDetalhe;
            for (int i = 0; i < davCabecalho.getDavDetalheList().size(); i++) {
                davDetalhe = davCabecalho.getDavDetalheList().get(i);
                tripa = ""
                        + davDetalhe.getId()
                        + davDetalhe.getIdDavCabecalho()
                        + davDetalhe.getIdProduto()
                        + davDetalhe.getNumeroDav()
                        + formatoData.format(davDetalhe.getDataEmissao())
                        + davDetalhe.getItem()
                        + Biblioteca.formatoDecimal("Q", Double.parseDouble(davDetalhe.getQuantidade().toString()))
                        + Biblioteca.formatoDecimal("V", Double.parseDouble(davDetalhe.getValorUnitario().toString()))
                        + Biblioteca.formatoDecimal("V", Double.parseDouble(davDetalhe.getValorTotal().toString()))
                        + davDetalhe.getCancelado()
                        + davDetalhe.getMesclaProduto()
                        + davDetalhe.getGtinProduto()
                        + davDetalhe.getNomeProduto()
                        + davDetalhe.getTotalizadorParcial()
                        + davDetalhe.getUnidadeProduto()
                        + "0";
                davDetalhe.setHashTripa(Biblioteca.MD5String(tripa));

                JPAUtil.mergeObjeto(davDetalhe);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //TODO : O que está faltando para completar essa rotina mesclaDAV?
    public Integer mesclaDAV(List<DavCabecalho> pListaDAVCabecalho, String destinatario, String cnpjCpf) {
        //inicia e configura o novo DAV
        DavCabecalho novoDAV = new DavCabecalho();
        java.util.Date hoje = new java.util.Date();
        novoDAV.setDataEmissao(hoje);
        SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm:ss");
        novoDAV.setHoraEmissao(formatoHora.format(hoje));
        novoDAV.setSituacao('P');
        novoDAV.setNomeDestinatario(destinatario);
        novoDAV.setCpfCnpjDestinatario(cnpjCpf);
        novoDAV.setIdPessoa(0);
        novoDAV.setTaxaAcrescimo(BigDecimal.ZERO);
        novoDAV.setAcrescimo(BigDecimal.ZERO);
        novoDAV.setTaxaDesconto(BigDecimal.ZERO);
        novoDAV.setDesconto(BigDecimal.ZERO);
        novoDAV.setSubtotal(BigDecimal.ZERO);
        novoDAV.setHashIncremento(-1);

        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        String numeroUltimoDav = (String) em.createQuery("SELECT d.numeroDav FROM DavCabecalho"
                + " d WHERE d.id = (SELECT MAX(d1.id) FROM DavCabecalho d1").getSingleResult();

        if (numeroUltimoDav.equals("9999999999")) {
            novoDAV.setNumeroDav("0000000001");
        } else {
            int numeroNovoDav = Integer.valueOf(numeroUltimoDav) + 1;
            DecimalFormat formatoDav = new DecimalFormat("0000000000");
            novoDAV.setNumeroDav(formatoDav.format(numeroNovoDav));
        }

        //atualiza a tabela de cabecalho
        for (DavCabecalho dav : pListaDAVCabecalho) {
            if (dav.getSelecao() != null) {
                if (dav.getSelecao().equals("X")) {
                    dav.setSituacao('M');
                    JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIpServidor(), dav);
                }
            }
        }

        //cria um novo DAV
        novoDAV = (DavCabecalho) JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIpServidor(), novoDAV);

        try {
            //atualiza a tabela de detalhes
            List<DavDetalhe> listaDAVDetalhe = new ArrayList<DavDetalhe>();
            BigDecimal valorTotalNovoDav = BigDecimal.ZERO;

            int item = 0;
            for (int j = 0; j < pListaDAVCabecalho.size(); j++) {
                if (pListaDAVCabecalho.get(j).getSelecao() != null) {
                    listaDAVDetalhe = pListaDAVCabecalho.get(j).getDavDetalheList();
                    if (listaDAVDetalhe != null) {
                        for (int i = 0; i < listaDAVDetalhe.size(); i++) {
                            if (listaDAVDetalhe.get(i).getSelecao() != null) {
                                if (listaDAVDetalhe.get(i).getSelecao().equals("X")) {
                                    item++;
                                    valorTotalNovoDav = valorTotalNovoDav.add(listaDAVDetalhe.get(i).getValorTotal());
                                    valorTotalNovoDav.setScale(2, RoundingMode.DOWN);
                                    listaDAVDetalhe.get(i).setCancelado('N');
                                    listaDAVDetalhe.get(i).setMesclaProduto('N');
                                    JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIpServidor(), listaDAVDetalhe.get(i));
                                }
                            }
                        }
                    }
                }
            }
            novoDAV.setValor(valorTotalNovoDav);
        } catch (Exception e) {
            System.out.println("Erro ao //atualiza a tabela de detalhes" + e);
            e.printStackTrace();
        }

        novoDAV = (DavCabecalho) JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIpServidor(), novoDAV);
        return novoDAV.getId();
    }

    public List<DavCabecalho> listaDAVPeriodo(String pDataInicio, String pDataFim) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM DavCabecalho c WHERE c.situacao = 'E' AND c.dataEmissao BETWEEN ? AND ?");
        q.setParameter(1, pDataInicio);
        q.setParameter(2, pDataFim);
        List<DavCabecalho> retorno = q.getResultList();
        em.close();
        return retorno;
    }

    public List<DavCabecalho> listaDAVPendente() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM DavCabecalho c WHERE c.situacao = 'P'");
        List<DavCabecalho> retorno = q.getResultList();
        em.close();
        return retorno;
    }

    public DavCabecalho consultaDavCabecalho(Integer idDav) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM DavCabecalho c WHERE c.id = ?");
        q.setParameter(1, idDav);
        DavCabecalho retorno;
        try {
            retorno = (DavCabecalho) q.getSingleResult();
            em.close();
            return retorno;
        } catch (javax.persistence.NoResultException e) {
            em.close();
            return null;
        }
    }

    public void transfereDavParaCaixa(Integer idDav) {
        DavCabecalho davCabecalho = consultaDavCabecalho(idDav);
        JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIdEcfCaixa().getIp(), davCabecalho);
    }
}
